let dataArr = [
    { id: 1, name: "i1" },
    { id: 2, name: "i2", parentId: 1 },
    { id: 4, name: "i4", parentId: 3 },
    { id: 3, name: "i3", parentId: 2 },
    { id: 8, name: "i8", parentId: 7 },
];


function arrToTree(arr) {
    let map = new Map();
    let root = []
    for (let i = 0; i < arr.length; i++) {
        map.set(arr[i].id, arr[i])
    }

    for (let i = 0; i < arr.length; i++) {
        let pid = arr[i].parentId;
        if (pid) {
            let parent = map.get(pid);
            if (!parent) {
                console.log("pid", pid,) // 容错处理
            } else {
                !parent.children && (parent.children = [])
                parent.children.push(arr[i])
            }
        } else {
            root.push(arr[i])
        }
    }
    return root
}

console.dir(JSON.stringify(arrToTree(dataArr)))






// function getTree(arr) {
//     if (!arr || !Array.isArray(arr)) return "错误的数据类型";
//     var len = arr.length;
//     if (!len) return "空数组";
//     var rootObj = { id: null, name: null, children: [] };
//     var nodeObj = {};
//     for (var i = 0; i < len; i++) {
//       if (!arr[i].parentId) {
//         rootObj = {
//           id: arr[i].id,
//           name: arr[i].name,
//           children: [],
//         };
//       } else {
//         if (nodeObj.hasOwnProperty(arr[i].parentId)) {
//           nodeObj[arr[i].parentId].children.push(arr[i]);
//         } else {
//           nodeObj[arr[i].parentId] = {};
//           nodeObj[arr[i].parentId].children = [];
//           nodeObj[arr[i].parentId].children.push(arr[i]);
//         }
//       }
//     }
//     function getChildren(node) {
//       if (nodeObj[node.id] && nodeObj[node.id].children) {
//         node.children = nodeObj[node.id].children;
//         delete nodeObj[node.id];
//         var len = node.children.length;
//         if (len > 0) {
//           for (var i = 0; i < len; i++) {
//             getChildren(node.children[i]);
//           }
//         }
//       } else {
//         console.log(`${node.id}没有children`);
//       }
//     }
//     getChildren(rootObj);

//     for (var p in nodeObj) {
//       if (nodeObj.hasOwnProperty) {
//         console.warn(p + ":没有该父节点");
//       }
//     }
//     return rootObj;
//   }


//   console.log(JSON.stringify(getTree(dataArr)))